#ifndef ESCOPO_H_INCLUDED
#define ESCOPO_H_INCLUDED

typedef struct estruturaFunc
{
    int id;
    int ext;
    int nrArg;
    struct estruturaFunc *next;
}sFunc;

typedef struct estruturaVar
{
    int id;
    int isParameter;
    int val;
    char valString[MAX_STRING_LENGTH];
    struct estruturaVar *next;
}sVar;

typedef struct estruturaLib
{
    char library[MAX_STRING_LENGTH];
    char fName[MAX_STRING_LENGTH];
    int nrArg;
    struct estruturaLib *next;
}sLib;

sFunc *tabFuncao = NULL;
sVar *tabVar = NULL;
sLib *tabLib = NULL;

sFunc* buscaFuncao( int id )
{
	sFunc *iterador = tabFuncao;
	while( iterador != NULL )
	{
		if( iterador->id == id ) return iterador;
		iterador = iterador->next;
	}
	return NULL;
}

sVar* buscaVar( int id )
{
    sVar *iterador = tabVar;
	while( iterador != NULL )
	{
		if( iterador->id == id ) return iterador;
		iterador = iterador->next;
	}
	return NULL;
}

sLib* buscaLib( char library[], char fName[] )
{
    sLib *iterador = tabLib;
    while( iterador != NULL )
    {
        if( strcmp( iterador->library, library ) == 0 )
            if( strcmp( iterador->fName, fName ) == 0 ) return iterador;
        iterador = iterador->next;
    }
    return NULL;
}

int insereVar( int id, int isParameter )
{
    sVar *iterador = tabVar, *antecessor = NULL;
    if( tabVar == NULL )
    {
        tabVar = ( sVar* )malloc( sizeof( sVar ) );
        tabVar->id = id;
        tabVar->isParameter = isParameter;
        tabVar->next = NULL;
        return 1;
    }
    while( iterador != NULL )
    {
        if( iterador->id == id ) return 0;
        antecessor = iterador;
        iterador = iterador->next;
    }
    iterador = ( sVar* )malloc( sizeof( sVar ) );
    iterador->id = id;
    iterador->isParameter = isParameter;
    iterador->next = NULL;
    antecessor->next = iterador;
    return 1;
}

int declaraFuncao( int id, int ext, int nrArg )
{
    sFunc *iterador = tabFuncao, *antecessor = NULL;
    if( tabFuncao == NULL )
    {
        tabFuncao = ( sFunc* )malloc( sizeof( sFunc ) );
        tabFuncao->id = id;
        tabFuncao->ext = ext;
        tabFuncao->nrArg = nrArg;
        tabFuncao->next = NULL;
        return 1;
    }
    while( iterador != NULL )
    {
        if( iterador->id == id ) return 0;
        antecessor = iterador;
        iterador = iterador->next;
    }
    iterador = ( sFunc* )malloc( sizeof( sFunc ) );
    iterador->id = id;
    iterador->ext = ext;
    iterador->nrArg = nrArg;
    iterador->next = NULL;
    antecessor->next = iterador;
    return 1;
}

void limpaListaVar()
{
    sVar *coletor = NULL, *sucessor = tabVar;
    while( sucessor != NULL )
    {
        coletor = sucessor;
        sucessor = sucessor->next;
        free( coletor );
    }
    tabVar = NULL;
}

void inserirFlib( char library[], char fName[], int nrArg )
{
    sLib *iterador = tabLib, *antecessor = NULL;
    if( tabLib == NULL )
    {
        tabLib = ( sLib* )malloc( sizeof( sLib ) );
        strcpy( tabLib->library, library );
        strcpy( tabLib->fName, fName );
        tabLib->nrArg = nrArg;
        tabLib->next = NULL;
        return;
    }
    while( iterador != NULL )
    {
        if( strcmp( iterador->library, library ) == 0 )
            if( strcmp( iterador->fName, fName ) == 0 ) return;
        antecessor = iterador;
        iterador = iterador->next;
    }
    iterador = ( sLib* )malloc( sizeof( sLib ) );
    strcpy( iterador->library, library );
    strcpy( iterador->fName, fName );
    iterador->nrArg = nrArg;
    iterador->next = NULL;
    antecessor->next = iterador;
}

void iniciaLib()
{
    inserirFlib( "Lang", "abs", 1 );
    inserirFlib( "Lang", "min", 2 );
    inserirFlib( "Lang", "max", 2 );
    inserirFlib( "Lang", "parseInt", 1 );
    inserirFlib( "Lang", "parseFloat", 1 );
    inserirFlib( "Lang", "isInt", 1 );
    inserirFlib( "Lang", "isFloat", 1 );
    inserirFlib( "Lang", "maxInt", 0 );
    inserirFlib( "Lang", "minInt", 0 );
    inserirFlib( "Lang", "float", 0 );
    inserirFlib( "Lang", "exit", 1 );
    inserirFlib( "Lang", "abort", 1 );
    inserirFlib( "Lang", "random", 1 );
    inserirFlib( "Lang", "seed", 1 );
    inserirFlib( "Lang", "characterSet", 0 );

    inserirFlib( "Float", "int", 1);
    inserirFlib( "Float", "floor", 1);
    inserirFlib( "Float", "ceil", 1);
    inserirFlib( "Float", "pow", 2);
    inserirFlib( "Float", "round", 1);
    inserirFlib( "Float", "sqrt", 1);
    inserirFlib( "Float", "maxFloat", 0);
    inserirFlib( "Float", "minFloat", 0);

    inserirFlib( "String", "length", 1);
    inserirFlib( "String", "isEmpty", 1);
    inserirFlib( "String", "charAt", 2);
    inserirFlib( "String", "subString", 3);
    inserirFlib( "String", "find", 2);
    inserirFlib( "String", "replace", 3);
    inserirFlib( "String", "elements", 2);
    inserirFlib( "String", "elementAt", 3);
    inserirFlib( "String", "removeAt", 3);
    inserirFlib( "String", "replaceAt", 4);
    inserirFlib( "String", "insertAt", 4);
    inserirFlib( "String", "squeeze", 1);
    inserirFlib( "String", "trim", 1);
    inserirFlib( "String", "compare", 2);
    inserirFlib( "String", "toString", 1);
    inserirFlib( "String", "format", 2);

    inserirFlib( "URL", "isValid", 1);
    inserirFlib( "URL", "getScheme", 1);
    inserirFlib( "URL", "getHost", 1);
    inserirFlib( "URL", "getPort", 1);
    inserirFlib( "URL", "getPath", 1);
    inserirFlib( "URL", "getParameters", 1);
    inserirFlib( "URL", "getQuery", 1);
    inserirFlib( "URL", "getFragment", 1);
    inserirFlib( "URL", "getBase", 0);
    inserirFlib( "URL", "getReferer", 0);
    inserirFlib( "URL", "resolve", 2);
    inserirFlib( "URL", "escapeString", 1);
    inserirFlib( "URL", "unescapeString", 1);
    inserirFlib( "URL", "loadString", 2);

    inserirFlib( "WMLBrowser", "getVar", 1);
    inserirFlib( "WMLBrowser", "setVar", 2);
    inserirFlib( "WMLBrowser", "go", 1);
    inserirFlib( "WMLBrowser", "prev", 0);
    inserirFlib( "WMLBrowser", "newContext", 0);
    inserirFlib( "WMLBrowser", "getCurrentCard", 0);
    inserirFlib( "WMLBrowser", "refresh", 0);

    inserirFlib( "Dialogs", "prompt", 2);
    inserirFlib( "Dialogs", "confirm", 3);
    inserirFlib( "Dialogs", "alert", 1);
}

#endif // ESCOPO_H_INCLUDED
